/*******************************************************************************
/
/ sred.h
/
/ Creado por Roberto García Carvajal.
/
/ Sistema de red. Incluye una clase de mensajes para intercambiar información. Trabaja en 2 capas.
/ Una primera capa se ocupa de interpretar los mensajes, codificarlos y decodificarlos
/ a cadenas de bytes. Esta es la capa que se ocupa de dar soporte a 64 bytes.
/ La segunda capa se ocupa de enviar y recibir los mensajes cifrados.
/
/ Hace uso de un hilo con el que se sincroniza mediante un semáforo.
/
/ Documento bajo licencia GPL.
/
*******************************************************************************/

#include <queue>
#include <SDL/SDL_thread.h>
#include <SDL/SDL.h>
#include <SDL/SDL_net.h>
#include "mapa.h"

using namespace std;

#ifndef C_RED
#define C_RED

// Tipos de mensajes.
#define M_CONECTAR     1
#define M_MENSAJE      2
#define M_MOVIMIENTO   3
#define M_ATAQUE       4
#define M_ESPECIAL     5
#define M_DESCONECTAR  6
#define M_EJERCITO     7
#define M_PASATURNO    8
#define M_PUNTUACION  10
#define M_PFINAL      11
#define M_UNIDADS     12
#define M_FINUNIDADS  13
#define M_MAPA        14
#define M_MAPAU       15
#define M_FINMAPAU    16
#define M_INICIA      17
#define M_MAPA_NT     18
#define M_MAPA_T      19
#define M_MAPA_E      20
#define M_C_MAPA      21

// Declaraciones adelantadas.
class c_svideo;
class c_nucleo;

// Mensajes de alto nivel.
struct mensaje
{
 char tipo;
 union
 {
  int coordenadas[2];
  char mensaje[250];
  int dano;
  int version[3];
 } cuerpo;
 mensaje(char t);
 mensaje(char t,int cx, int cy);
 mensaje(char t,char * m);
 mensaje(char t,int d);
 mensaje(char t,int v1,int v2,int v3);
 mensaje(char m[256]);
 mensaje() {}
 char * convertir();
};

// Métodos de construcción rápida de mensajes para el núcleo.
mensaje puntuacion(unsigned int p);
mensaje puntuacionfinal(unsigned int p);
mensaje nuevaunidad2(unsigned int unidad, unsigned int vida, unsigned int blindaje);
mensaje finunidades();
mensaje emapa(char * nmapa);
mensaje colocarunidad(unsigned int unidad,unsigned int posx,unsigned int posy);
mensaje fincolocarunidades();
mensaje primerturno(unsigned int turno);
mensaje movimiento(unsigned int unidad,unsigned int x,unsigned int y);
mensaje ataque(unsigned int objetivo,unsigned int dano);
mensaje mens(char * m);
mensaje env_ejercito(int ejer);
mensaje pasa_turno();
mensaje enviar_mapa(c_mapa mapa);
mensaje tengomapa(int resp);
mensaje desconectar();

// Clase sistema de red.
class c_sred
{
 public:
  c_sred();
  ~c_sred();
  void asociar_svideo(c_svideo * v) { svideo = v; }
  void asociar_nucleo(c_nucleo * n) { nucleo = n; }
  void servidor();
  void cliente(char * ip);
  bool conectado() { return vconectado; }
  bool conectando() { return vconectando; }
  void comprobarestadoconexion();
  void nuevomensaje(mensaje m);
  void ciclo();
  queue<int> devolver();
 private:
  c_svideo * svideo;
  c_nucleo * nucleo;
  queue<char*> buzon;
  bool vconectado;
  bool vconectando;
  SDL_Thread * hilo;
  TCPsocket lsocket,rsocket;
  IPaddress lip,*rip;
  char buffer_salida[512],buffer_entrada[512]; 
};

#endif
